package org.atlantis.net.base.echotcp;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;

/*
 * 典型的TCP服务端创建一般分为2个大致步逐：
 * 1.创建一个ServerSocket实例来启动服务。
 * 2.重复执行如下内容：
 *    a.调用ServerSocket的accept方法来获取下一个客户端连接。
 *    b.使用代表与客户端连接的Socket实例的InputStream和OutputStream与客户端进行通信。
 *    c.通信完成后，使用Socket类的close方法关闭与客户端的连接。
 */
public class TCPEchoServer {

	private static final int BUFFER_SIZE = 32;
	private static final int SERVER_PORT = 10006;

	public static void main(String[] args) throws IOException {
		// 创建服务端的ServerSocket对象，用来接收客户端Socket的连接请求
		ServerSocket ssocket = new ServerSocket(SERVER_PORT);
		// 接收到消息的字节数
		int receivedMsgSize;
		byte[] receivedBuffer = new byte[BUFFER_SIZE];
		// 接收连接，处理连接
		while (true) {
			// 获取客户端的连接，accept方法将会阻塞，直到有客户端连接进来为止
			Socket s = ssocket.accept();
			SocketAddress address = s.getRemoteSocketAddress();
			System.out.println("Handling client at " + address);
			InputStream in = s.getInputStream();
			OutputStream out = s.getOutputStream();

			// read方法会阻塞，直到能够读取到数据为止
			while ((receivedMsgSize = in.read(receivedBuffer)) != -1) {
				out.write(receivedBuffer, 0, receivedMsgSize);
			}
			s.close();
		}
	}
}
